IICS CDI Mappingでクエリ選択時にパラメータを使用する方法
はじめに
データアナリティクス事業本部ビッグデータチームのyosh-kです。
今回はIICS CDIのマッピング作成時にソースタイプにクエリを選択し、クエリの中でパラメータを使用できないか検討したので、その設定方法についてまとめたいと思います。方法としては以下の2種類があります。
- Secure Agent上のパラメータファイルから値を取得。
- タスクフロー上の割り当てステップでパラメータの値を取得。
実現したいこと
IICS CDIのマッピング作成時にソースタイプにクエリを選択し、クエリの中のwhere句で条件を指定する際に、条件の値をパラメータで変更できるようにしたいと思いました。下の図で言うと'2022-01-22'の箇所をパラメータとして設定したいと考えています。方法としては2種類ありましたので、それぞれ確認していきます。
前提条件
- Redshift OR Redshift serverlessが事前に構築されていることとします。 まだの方は以下ブログの「Redshift Serverless構築」項目を参考にしてみてください。今回も以下ブログで構築したflightdata tableを使用します。
- S3 Connectorが設定されていることを前提とします。まだの方は以下ブログの「S3 Connector設定」項目を参考にしてみてください。
IICS CDI Amazon Redshift V2 ConnectorでRedshift Serverlessと接続できるか試してみた
- where句で条件通り抽出できていることを確認するために、flightdata tableの「flight_date」の日付が異なるレコードを用意します。
- 私の場合は、以下のSQL文を実行し、日付のみ異なるデータを用意しました。
INSERT INTO public.flightdata( select '2022-01-22', flight_number, origin_city, origin_state, destination_city, destination_state, departure_delay, arrival_delay, cancelled, diverted, air_time, distance, distance_group, carrier_delay, weather_delay, security_delay, late_aircraft_delay, origin_airport_name, cancellation_reason, destination_airport_name, carrier_name from public.flightdata limit 10 )
Secure Agent上のパラメータファイルから値を取得
Infomatica Communityにも記載があるようにSecure Agent上のパラメータファイルから値を取得してクエリで使用する方法があるので、試してみます。
HOW TO: Use parameters in custom query in a mapping task in Informatica Cloud
マッピング作成
まずはマッピングを作成します。ソースのコネクタはRedshiftコネクタ、ソースタイプはクエリ、クエリの中で以下のようにパラメータを$$の後に指定します。
select * from public.flightdata where flight_date = '$$date_param'
ターゲットには任意のS3格納パスとcsvファイルを新規作成で指定します。
マッピングの作成は以上で保存して完了です。
パラメータファイルの作成
次にSecure Agent上で、パラメータファイルを作成していきます。パラメータファイルの作成方法は以下のブログ記事を参考にしてみてください。
IICS CDIのタスクフローでパラメータファイルを使用する
私は以下のパラメータファイルを作成し、data_paramの値を「2022-01-22」に設定しました。
$ cat /home/infa/infaagent/apps/Data_Integration_Server/data/userparameters/parameter.txt
[Global] $$date_param=2022-01-22
マッピングタスクの作成
マッピングタスクの作成時には先ほど作成したマッピングを選択し、パラーメータファイル名には「parameter.txt」を指定します。それ以外は、デフォルトのままで保存して完了です。
実行結果確認
マッピングタスクを実行し、実行結果を確認します。ログ上のクエリからもparameter.txtで指定した値で抽出できています。
## log unload ('select * from public.flightdata where flight_date = \'2022-01-22\'')
S3上にも問題なく「2022-01-22」の日付が抽出できていることを確認できました。
タスクフローの割り当てステップでパラメータの値を取得
タスクフローの割り当てステップを使用すれば、フィールドの値を設定することができます。
Assignment step
マッピング作成
先程と同様にマッピングを作成します。ソースのコネクタはRedshiftコネクタ、ソースタイプはクエリ、クエリの中で以下のようにパラメータを$$の後に指定します。
select * from public.flightdata where flight_date = '$$date_param'
ターゲットも同様に任意のS3格納パスとcsvファイルを新規作成で指定します。
今回は入出力パラーメータをとして「date_param」を使用するので、右上の「x」ボタンを選択し、入出力パラメータをプラスボタンから作成します。 今回は、日付型のパラメータなので、データ型はstring、精度は20で設定します。
マッピングの作成は以上で保存して終了です。
マッピングタスクの作成
マッピングタスクの作成は、先ほど作成したマッピングを設定し、あとは初期設定のままで保存して完了です。
タスクフローの作成
タスクフローの作成をしていきます。まずはデータタスクを選択し、先ほど作成したマッピングタスクを指定します。
次に割り当てステップをデータタスクの前に設定します。
プロパティの割り当てからフィールドの追加を押下し、InOut Parametersのdata_paramを選択し、パラメータの値「2010-06-06」を入力します。
タスクフローの作成は以上で保存して完了です。
実行結果確認
タスクフローを実行し、実行結果を確認します。ログ上のクエリからも割り当てステップで指定した値で抽出できています。
## log unload ('select * from public.flightdata where flight_date = \'2010-06-06\'')
S3上にも問題なく「2010-06-06」の日付が抽出できていることを確認できました。
最後に
Secure Agent上のパラーメータファイルを使用する場合は、毎回サーバー上のファイルを書き換える必要があり少し不便なので、後者の方が使いやすいのかと個人的には思いました。同様の処理を実装する方の助けになれば幸いです。